﻿using System;
using System.Collections.Generic;
using System.IO;
using Dapper;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NLog;
using NLog.Extensions.Logging;
using LogLevel = Microsoft.Extensions.Logging.LogLevel;

namespace dataXJobGenerator
{
    public class Program
    {
        private static void Main(string[] args)
        {
            var logger = LogManager.GetCurrentClassLogger();
            try
            {
                var config = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile("appsettings.json", true, true)
                    .Build();

                var serviceProvider = StartUp.BuildDependInject(config);
                var jobGenerator = serviceProvider.GetService<JobGenerator>();
                jobGenerator.DoAction();
            }
            catch (Exception ex)
            {
                // NLog: catch any exception and log it.
                logger.Error(ex, ">> Stopped program because of exception");
            }
            finally
            {
                LogManager.Shutdown();
            }
        }
        
        private static class StartUp
        {
            public static IServiceProvider BuildDependInject(IConfiguration config)
            {
                var serviceCollection = new ServiceCollection();
                var dataSource = DataSourceConfiguration.GetDataSource(config);

                serviceCollection
                    .AddTransient<JobGenerator>()
                    .AddSingleton(config)
                    .AddLogging(loggingBuilder =>
                    {
                        LogManager.Configuration =new NLogLoggingConfiguration(config.GetSection("NLog"));
                        loggingBuilder.ClearProviders();
                        loggingBuilder.SetMinimumLevel(LogLevel.Trace);
                        loggingBuilder.AddNLog(config);
                    });
                
                if (dataSource.DbType.Equals("ORACLE"))
                {
                    serviceCollection.AddSingleton<IDBColumnsUtil>(new OracleDBColumnsUtil());
                }
                if (dataSource.DbType.Equals("SQLSERVER"))
                {
                    serviceCollection.AddSingleton<IDBColumnsUtil>(new SQLServerDBColumnsUtil());
                }
                
                var serviceProvider= serviceCollection.BuildServiceProvider();

                return serviceProvider;
            }
        }
    }

   
}